package com.kevinkk.dp;

/**
 * 给定一个整数数组prices，其中第  prices[i] 表示第 i 天的股票价格 。
 * 设计一个算法计算出最大利润。在满足以下约束条件下，你可以尽可能地完成更多的交易（多次买卖一支股票）:
 * 卖出股票后，你无法在第二天买入股票 (即冷冻期为 1 天)。
 * 注意：你不能同时参与多笔交易（你必须在再次购买前出售掉之前的股票）。
 */

/**
 * dp[i][0] 持有(买入)：要么一致持有，要么在冷冻期结束之后买入
 * dp[i][1] 不持有(卖出)：要么保持卖出，要么买入后立即卖出
 * dp[i][2] 冷冻期：要么一直在冷冻期，要么一致卖出后转入冷冻期
 */

public class BestTimeToBuyAndSellStockWithCooldown {
    class Solution {
        public int maxProfit(int[] prices) {
            int length = prices.length;
            int[][] dp = new int[length][3];
            dp[0][0] = -prices[0];  // 持有(买入)
            dp[0][1] = 0;           // 不持有(卖出)
            dp[0][2] = 0;           // 冷冻期

            for (int i = 1; i < length; i++) {
                dp[i][0] = max(dp[i-1][0], dp[i-1][2] - prices[i]);
                dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i]);
                dp[i][2] = max(dp[i-1][2], dp[i-1][1]);
            }

            return max(dp[length - 1][0], dp[length - 1][1], dp[length - 1][2]);
        }

        public int max(int... vals){
            int max = Integer.MIN_VALUE;
            for(int val : vals) max = Math.max(max, val);
            return max;
        }
    }
}
